﻿// 定义
#define Unity5
#define Unity6
#define Unity2021
#define Unity2022

#define Windows
#define IOS


#undef Unity5  // 取消定义


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Lession16
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 预处理器指令
            // 什么是编译器
            // 编译器是一种翻译程序
            // 它用于将源语言程序翻译为目标语言程序

            // 源语言程序：某种程序设计语言写成的，比如 c#、c、c++、java、python 等语言写的程序
            // 目标语言程序：二进制数表示的伪机器代码写的程序。编译器翻译后的程序，通常是机器语言程序，比如 c# 编译后是 IL 代码

            // 什么是预处理器指令
            // 预处理器质量 指导编译器 在实际编译开始之前对信息进行预处理
            // 预处理器指令是以 # 开头的指令
            // 预处理器指令不是语句，所以它们不以分号（;）结尾
            // 目前我们经常用到的 折叠代码块（#region） 就是预处理器指令


            // 常见的预处理器指令
            // 1、
            // #define 定义一个符号，类似一个没有值的变量
            // #undef 取消define定义的符号，让其失效
            // 两者都是写在脚本文件最前面
            // 一般配合 if 指令使用，或配合特性

            // 2、
            // #if  #elif  #else  #endif
            // 和if语句规则一样，一般配合 #define 定义的符号使用
            // 用于告诉编译器进行编译代码的流程控制

            // 如果发现有 Unity5这个符号，就会将下面的代码编译，没有就会置灰 ，因为将上面Unity5取消定义了
            // 通过逻辑或 、逻辑与 进行多种符号的组合判断
#if Unity5
                Console.WriteLine("Unity5");
#endif
#if Unity6
                Console.WriteLine("Unity6");
#endif

#if Unity2021
                Console.WriteLine("Unity2021");
#elif Unity2022
                Console.WriteLine("Unity2022");
#else
                Console.WriteLine("其他版本");
#endif

#if Unity6 && IOS
            Console.WriteLine("Unity6&IOS");
#endif


            // 3、
            // #warning
            // #error
            // 告诉编译器
            // 是报警告 还是 报错误
            // 一般是配合if使用
#if Unity6 && Windows
            Console.WriteLine("Unity6&IOS");
#warning 这个版本将不再支持
#endif

            #endregion
        }
    }
}
